Logo du tournoi
Avant de commencer, assurez-vous d’avoir téléchargé les fichiers suivants :
Classe_Monster.RMonster_EMS.Rdataet d’avoir installé et chargé les packages :
library(Matrix)
library(lattice)
library('plot.matrix')
library(stringr)
Un SD Monster est un monstre qui possède un certain nombre de caractéristiques :
Dans R, nous avons créé une classe d’objet S4 pour ça.
Pour ce faire, vous devez charger le fichier
Classe_Monster.R à l’aide de la commande suivante :
source("Classe_Monster.R")
Le but, comme certains jeux de combats, est de laisser deux SD Monsters s’affronter dans un combat. Pour ce faire, voici les caractéristiques :
attack(_spe) : puissance d’une attaque (spéciale),defense(_spe) : défense vis-à-vis d’une attaque
(spéciale),HP : points de vie,Esquive/Accuracy : capacité à éviter d’être touché ou à
réussir à toucher,Critical : capacité à infliger des coups
critiques,Speed : vitesse d’action.De plus, chaque SD Monster possède quatre attaques
(attack1 jusqu’à attack4) faisant des dégâts
en fonction de son type (symbolisé par une lettre) et par les deux types
du SD Monster qui se défend (type1 et
type2). Pour connaître l’influence des types sur les
autres, vous devez charger le fichier suivant :
load("Monster_EMS.Rdata")
Et vous pouvez afficher les influences à l’aide de la commande suivante :
Table_of_type_display(Table_of_type)
Ainsi, une case blanche signifie que l’attaque de la ligne n’a pas d’influence sur le type de la colonne, une case rouge (ou noir) que sa puissance est réduite (voir inutile) et une case verte que l’attaque est plus efficace.
Les SD monsters s’affrontent entre eux sans intervention.
Nous pouvons simplement leur donner quelques indications avec le combat.
Pour cela, nous utilisons la fonction Fight. Par exemple,
nous avons :
Monstre_gagnant<-Fight(Monstre1,Monstre2)
## #################################
## Kohyl VS Mon monstre
## #################################
## Barre de vie de Kohyl
## | |======================================================================| 100%
## Barre de vie de Mon monstre
## | |======================================================================| 100%
## Mon monstre attaque
## Barre de vie de Kohyl
## | |=================================================================== | 96%
## Kohyl attaque
## Raté
## Vie de Mon monstre
##
## Mon monstre attaque
## C'est inefficace
## Barre de vie de Kohyl
## | |=================================================================== | 95%
## Kohyl attaque
## C'est très efficace
## Vie de Mon monstre
## | |================================== | 49%
## Mon monstre attaque
## Raté
## Barre de vie de Kohyl
##
## Kohyl attaque
## Vie de Mon monstre
## | |========== | 15%
## Mon monstre attaque
## Barre de vie de Kohyl
## | |================================================================ | 91%
## Kohyl attaque
## Vie de Mon monstre
## | | | 0%
## Kohyl a gagné
Monstre_gagnant
## Monstre Kohyl
## Type 1 : A et type 2 : H
## ####################
## Caractéristiques
## ####################
## Attaque : 60 - Défense : 60
## Attaque spéciale : 55 - Défense spéciale : 45
## Esquive : 43 - Précision : 40
## Coup critique : 57 - Vitesse : 52
## Et 380 points de vie
## ####################
## Types des attaques
## ####################
## Attaque 1 : A - Attaque 2 : I
## Attaque 3 : C - Attaque 4 : H
Ici, c’est le monstre Kohyl qui a gagné. Quelques options permettent de faire varier l’expérience du combat :
prob_1 et prob_2 permettent de favoriser
certaines attaques. Par défaut, toutes les attaques ont la même
probabilité d’être utilisées.display=TRUE (par défaut) propose de visualiser le
combat avec un grand nombre d’informations.summary=TRUE (non utilisée si
display=TRUE) n’affiche qu’une proportion des points de
vies.time est le temps (en seconde) entre deux coups pour
éviter que tout défile à grande vitesse. Si vous souhaitez faire un
grand nombre de combats rapidement, il vaut mieux mettre
time=0.Par exemple, la commande suivante permet un combat plus rapide avec moins d’informations :
Fight(Monstre1,Monstre2,display=FALSE,time = 0.1)
## #################################
## Kohyl VS Mon monstre
## #################################
## Evolution Kohyl à gauche et Mon monstre à droite
## | |=========================================================== | 85% | |======================================================================| 100%
## Kohyl a gagné
## Monstre Kohyl
## Type 1 : A et type 2 : H
## ####################
## Caractéristiques
## ####################
## Attaque : 60 - Défense : 60
## Attaque spéciale : 55 - Défense spéciale : 45
## Esquive : 43 - Précision : 40
## Coup critique : 57 - Vitesse : 52
## Et 380 points de vie
## ####################
## Types des attaques
## ####################
## Attaque 1 : A - Attaque 2 : I
## Attaque 3 : C - Attaque 4 : H
Vous êtes libres de choisir comment vous allez décider quel sera le meilleur SD Monster. Si vous choisissez de le faire en utilisant les notions apprises en cours, vous pouvez par exemple adapter ce code qui conserve le dernier SD monster qui a gagné :
###########
# Monstre gagnant
###########
Monster_gagnant<-SD_monster()
for (it in 1:25){
##########
# Nouveau combat
##########
Monster_gagnant<-Fight(Monster_gagnant,SD_monster(),display = FALSE,summary = FALSE,time = 0)
##########
# Affichage pour suivi
##########
cat("Le SD monster gagnant est:",Monster_gagnant@name,"\n")
}
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Suvam
## Le SD monster gagnant est: Kuxif
## Le SD monster gagnant est: Kuxif
## Le SD monster gagnant est: Kuxif
## Le SD monster gagnant est: Kuxif
## Le SD monster gagnant est: Nahym
## Le SD monster gagnant est: Nahym
## Le SD monster gagnant est: Nahym
## Le SD monster gagnant est: Nahym
## Le SD monster gagnant est: Nahym
## Le SD monster gagnant est: Nahym
## Le SD monster gagnant est: Xehiz
## Le SD monster gagnant est: Xehiz
## Le SD monster gagnant est: Xehiz
## Le SD monster gagnant est: Xehiz
## Le SD monster gagnant est: Sivoc
Ici, le dernier SD monster conservé est Sivoc. On peut aussi imaginer de garder les caractéristiques pour les étudier. Pour cela, nous devons stocker les caractéristiques :
##########
# Fonction qui récupère les informations
##########
Stockage<-function(Monster){
data.frame(name=Monster@name,
attack=Monster@attack,
attack_spe=Monster@attack_spe,
defense=Monster@defense,
defense_spe=Monster@defense_spe,
HP=Monster@HP,
Esquive=Monster@Esquive,
Critical=Monster@Critical,
Speed=Monster@Speed,
Accuracy=Monster@Accuracy,
type1=Monster@type1@type,
type2=Monster@type2@type,
attack1=Monster@attack1@type,
attack2=Monster@attack2@type,
attack3=Monster@attack3@type,
attack4=Monster@attack4@type)
}
Stockage(Monster_gagnant)
## name attack attack_spe defense defense_spe HP Esquive Critical Speed
## 1 Sivoc 5 64 92 71 330 68 50 63
## Accuracy type1 type2 attack1 attack2 attack3 attack4
## 1 4 B G F C J G
On peut ainsi simuler plusieurs combats et essayer de voir ce qui fait que quelqu’un gagne ou pas :
############
# Boucle de 25 combats
############
for (it in 1:25){
#############
# Monstres
#############
Monstre_1<-SD_monster()
Monstre_2<-SD_monster()
#############
# Combat
#############
Monstre_gagnant<-Fight(Monster_1 = Monstre_1,Monster_2 = Monstre_2,
display = FALSE,summary = FALSE,time = 0)
#############
# Stockage
#############
temp_1<-Stockage(Monstre_1)
temp_2<-Stockage(Monstre_2)
#############
# Victoire ?
#############
temp_1$Victoire<-(Monstre_gagnant@name==Monstre_1@name)
temp_2$Victoire<-(Monstre_gagnant@name==Monstre_2@name)
if (it==1){
Bilan<-rbind(temp_1,temp_2)
}else{
Bilan<-rbind(Bilan,temp_1,temp_2)
}
}
Bilan
## name attack attack_spe defense defense_spe HP Esquive Critical Speed
## 1 Kaqaw 58 49 57 37 550 59 41 57
## 2 Tozex 31 20 28 35 560 60 27 101
## 3 Byjuf 73 35 13 2 390 55 71 94
## 4 Jolez 52 36 42 75 540 17 81 80
## 5 Potys 38 70 48 91 850 12 26 17
## 6 Mekyg 28 81 10 3 1070 16 35 84
## 7 Penuh 72 67 34 87 190 48 39 5
## 8 Fuhix 72 63 64 20 620 63 9 11
## 9 Pytuk 8 50 55 113 170 3 78 76
## 10 Zeqap 39 62 29 83 510 41 25 61
## 11 Wijeq 16 28 18 86 890 74 86 29
## 12 Fobog 89 29 57 87 250 66 55 33
## 13 Wucob 58 78 68 17 830 22 42 33
## 14 Nimuw 73 28 21 41 400 26 89 92
## 15 Nipik 115 34 101 11 60 5 100 11
## 16 Cugor 11 87 55 80 170 68 27 89
## 17 Xyquar 3 37 53 78 480 49 92 68
## 18 Fokiq 81 15 40 44 740 57 57 7
## 19 Povej 0 63 39 41 810 36 84 78
## 20 Hysot 42 87 28 20 110 39 58 76
## 21 Vyxes 44 37 77 89 800 3 58 46
## 22 Zuqom 35 57 71 48 600 2 95 9
## 23 Cokok 137 26 25 31 50 12 81 8
## 24 Dynir 45 17 51 67 20 67 27 85
## 25 Vyrug 79 60 88 60 10 5 109 14
## 26 Qydek 55 51 100 46 890 43 1 43
## 27 Riboj 47 85 65 73 200 13 84 37
## 28 Waqec 74 1 53 1 810 94 11 58
## 29 Kalil 34 26 40 76 840 37 54 61
## 30 Wocyn 45 57 65 9 460 67 83 56
## 31 Wuhuc 56 61 46 29 100 65 56 61
## 32 Zaquik 82 29 3 27 680 32 12 94
## 33 Dapej 11 99 11 56 720 30 5 93
## 34 Kecux 5 126 30 81 750 13 69 31
## 35 Paner 34 99 61 2 630 10 73 25
## 36 Mumav 62 66 33 50 270 7 88 62
## 37 Kupoj 27 73 85 12 120 61 82 11
## 38 Vypas 101 29 10 89 490 43 15 64
## 39 Zeliz 14 80 61 50 60 93 44 55
## 40 Vemos 22 14 45 49 610 44 77 73
## 41 Qekuh 16 51 3 42 140 39 82 145
## 42 Hiqual 24 51 30 57 630 64 34 58
## 43 Murit 92 6 90 26 650 11 93 60
## 44 Fogig 79 43 36 15 260 68 70 80
## 45 Cequuh 78 61 67 35 260 2 41 16
## 46 Xawaj 106 60 83 26 220 112 7 19
## 47 Fozym 5 97 9 81 400 87 54 51
## 48 Beqyc 45 63 47 64 670 25 29 59
## 49 Ronet 20 81 10 30 350 80 105 76
## 50 Syxax 43 99 46 49 800 80 25 27
## Accuracy type1 type2 attack1 attack2 attack3 attack4 Victoire
## 1 37 C H B D I F FALSE
## 2 92 G E H A B G TRUE
## 3 68 E A J D F C TRUE
## 4 13 I F I D J E FALSE
## 5 63 H C E G A F TRUE
## 6 86 G I C F D G FALSE
## 7 79 J D I J D F FALSE
## 8 86 I A B G H J TRUE
## 9 50 A G H I F B FALSE
## 10 59 B C D J H A TRUE
## 11 24 I B H A D G TRUE
## 12 9 C A H F J G FALSE
## 13 49 A G E D H J TRUE
## 14 40 E F G J C E FALSE
## 15 67 C B A F G B FALSE
## 16 16 E B A F G C TRUE
## 17 22 J F A E F D FALSE
## 18 75 F J B C J G TRUE
## 19 28 F I J D B E FALSE
## 20 89 I G F H C D TRUE
## 21 16 E A J H I G TRUE
## 22 73 J D C B A J FALSE
## 23 125 J E G I E F TRUE
## 24 89 D G C I E H FALSE
## 25 34 I F F H A D FALSE
## 26 22 J G H F A D TRUE
## 27 26 I F B H F A FALSE
## 28 77 F H F H B A TRUE
## 29 38 H D H C D F FALSE
## 30 22 H J J B F E TRUE
## 31 66 I F I J E D FALSE
## 32 103 G D H G F J TRUE
## 33 73 I D D J E G TRUE
## 34 20 H B A B E G FALSE
## 35 83 I D A C G E TRUE
## 36 55 B A J C B E FALSE
## 37 87 I E D I A G FALSE
## 38 50 D A D G A I TRUE
## 39 47 G E I J A D FALSE
## 40 65 H D I G H F TRUE
## 41 58 F I D B E G FALSE
## 42 69 F J H I J B TRUE
## 43 7 H G G D F C FALSE
## 44 33 J A G C A D TRUE
## 45 124 A G J I F H TRUE
## 46 15 H E H F J E FALSE
## 47 26 E J D C H F FALSE
## 48 51 G F H D C E TRUE
## 49 13 J B E J H F FALSE
## 50 1 I C G C B F TRUE
Nous pouvons alors analyser les caractéristiques par exemple avec un arbre aléatoire :
library(rpart)
library(rpart.plot)
########
# CART
########
Arbre<-rpart(Victoire~.,data = Bilan[,-1])
########
# Affichage
########
rpart.plot(Arbre)
Ou encore une forêt aléatoire :
library(randomForest)
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
############
# Random Forest
############
Bilan$Victoire<-as.factor(Bilan$Victoire)
Foret<-randomForest(Victoire~.,data = Bilan[,-1],ntree = 1000)
############
# Importance
############
############
# Affichage
############
varImpPlot(Foret,main = "Importance des caractéristiques")
Pour le tournoi, vous devez sélectionner le SD monster qui vous paraîtra le plus puissant et le sauvegarder avec la commande suivante :
Monster_Nom<-Monstre_gagnant
save("Monster_Nom",file="[nom].Rdata")
Nous ferons un tournoi où, suivant un tirage au sort, les SD monsters vont s’affronter deux à deux sur 5 manches. Le SD_monster qui aura gagné au moins trois manches passera au niveau suivant jusqu’à la finale. Vous aurez le droit de préciser les probabilités de chaque attaque avant chaque combat. Bon tournoi.
Comment créer un SD Monster ?
Pour créer un SD Monster, vous avez la fonction suivante :
qui va simuler toutes les caractéristiques que vous n’avez pas définies. Vous pouvez voir les caractéristique de votre SD monter en l’affichant :
On peut du coup choisir certaines caractéristiques et laisser le reste choisi par tirage au sort :